package qualomelhor.game;

import static playn.core.PlayN.assets;
import static playn.core.PlayN.graphics;

import java.util.LinkedList;

import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;

import playn.core.AssetWatcher;
import playn.core.Image;
import playn.core.ImageLayer;
import qualomelhor.database.Avatar.EstiloBoca;
import qualomelhor.database.Avatar.MovimentoSobrancelha;
import qualomelhor.database.Avatar.PosicaoBoca;
import qualomelhor.database.Avatar.PosicaoOlhoBoneco;

public class Boca {

	private ImageLayer layer;
	private Image imgBoca;
	private int posBocaId;
	private int estiloBocaId;
	private int scaleX = 1, scaleY = 1;
	private float x, y, angle;
	private boolean trocandoBoca = false;
	private PosicaoBoca posBocaAtual = PosicaoBoca.FELIZ;
	private EstiloBoca estiloBocaAtual = EstiloBoca.BOCA2;
	private LinkedList<PosicaoBoca> listPosicaoBocaPendente = new LinkedList<PosicaoBoca>();
	private LinkedList<EstiloBoca> listEstiloBocaPendente = new LinkedList<EstiloBoca>();
	private float baseCorpoWidth = 200;

	private boolean trocandoTemporario = false;
	private float tempoTrocaTemp = 0;
	private float tempoTrocaTempDest = 0;
	private PosicaoBoca posBocaTemp;

	public Boca (float baseCorpoWidth, int posBocaId, int estiloBocaId, float x, float y, Image imgBoca) {
		this.baseCorpoWidth = baseCorpoWidth;
		this.posBocaId = posBocaId;
		this.imgBoca = imgBoca;
		this.estiloBocaId = estiloBocaId;
		this.x = x;
		this.y = y;
		layer = graphics().createImageLayer(imgBoca);
		setImage(imgBoca);
	}

	public void update(float delta) {
		if (trocandoTemporario) {
			if (tempoTrocaTemp > tempoTrocaTempDest) {
				// volta pra posicao anterior
				trocaPosicaoBoca(posBocaTemp);
				trocandoTemporario = false;
			} else {
				tempoTrocaTemp += delta;
			}
		} else if (!trocandoBoca) {
			// Procura na lista de pendentes e executa
			if (listPosicaoBocaPendente.size() > 0) {
				trocaPosicaoBoca(listPosicaoBocaPendente.removeFirst());
			} else if (listEstiloBocaPendente.size() > 0) {
				trocaEstiloBoca(listEstiloBocaPendente.removeFirst());
			}
		}

		layer.setTranslation(x, y);
	}

	public void paint(float alpha) {
	}

	public ImageLayer getLayer() {
		return layer;
	}

	public float getBocaWidth() {
		return imgBoca.width();
	}

	public float getSobranHeight() {
		return imgBoca.height();
	}

	public int getPosBocaId() {
		return posBocaId;
	}

	public int getEstiloBocaId() {
		return estiloBocaId;
	}

	public PosicaoBoca getPosicaoBocaAtual() {
		return posBocaAtual;
	}

	public EstiloBoca getEstiloBocaAtual() {
		return estiloBocaAtual;
	}

	public Image getImage() {
		return imgBoca;
	}

	public float getX() {
		return x;
	}

	public float getY() {
		return y;
	}

	public int getScaleX() {
		return scaleX;
	}

	public int getScaleY() {
		return scaleY;
	}

	public boolean getTrocandoBoca() {
		return trocandoBoca;
	}

	public void setImage(Image imgBoca) {
		this.imgBoca = imgBoca;
		layer.setImage(this.imgBoca);
		float posBoca = (baseCorpoWidth - imgBoca.width()) / 2;
	    //Window.alert("posBoca = " + posBoca);
	    //lyBoca.setTranslation(posBoca, 94);
	    setPositionBoca(posBoca, 94);
	}

	public void setPosBocaId(int posBocaId) {
		this.posBocaId = posBocaId;
	}

	public void setEstiloBocaId(int estiloBocaId) {
		this.estiloBocaId = estiloBocaId;
	}

	public void setScale(int scX, int scY) {
		this.scaleX = scX;
		this.scaleY = scY;
	}

	public void setPositionBoca (float x, float y) {
		this.x = x;
		this.y = y;
	}

	public void setAngle(float angle) {
		this.angle = angle;
	}

	public void trocaPosicaoBoca(final PosicaoBoca posBC) {
		//Window.alert("trocando a boca..." + bc.getArquivo());
		if (!trocandoBoca) {
			trocandoBoca = true;
			posBocaAtual = posBC;
			final Image imgBoc = assets().getImage("/images/avatar/boca/" + estiloBocaAtual.getEstiloId() + "/boca" + posBC.getId() + ".png");

			AssetWatcher as = new AssetWatcher(new AssetWatcher.Listener() {
				@Override
				public void error(Throwable e) {
					//Window.alert("erro ao carregar a boca..");
					trocandoBoca = false;
				}

				@Override
				public void done() {
					setImage(imgBoc);
					trocandoBoca = false;
					//Window.alert("boca carregada..");
				}
			});
			as.add(imgBoc);
			as.start();
		} else {
			listPosicaoBocaPendente.add(posBC);
		}
	}

	public void trocaEstiloBoca(final EstiloBoca estBoca) {
		//Window.alert("trocando a boca..." + bc.getArquivo());
		if (!trocandoBoca) {
			trocandoBoca = true;
			estiloBocaAtual = estBoca;
			final Image imgBoc = assets().getImage("/images/avatar/boca/" + estBoca.getEstiloId() + "/boca" + posBocaAtual.getId() + ".png");

			AssetWatcher as = new AssetWatcher(new AssetWatcher.Listener() {
				@Override
				public void error(Throwable e) {
					Window.alert("erro ao carregar a boca..");
					trocandoBoca = false;
				}

				@Override
				public void done() {
					setImage(imgBoc);
					//layer.setImage(imgBoc);
					//float posBoca = (baseCorpoWidth - imgBoc.width()) / 2;
				    //Window.alert("posBoca = " + posBoca);
					//setPositionBoca(posBoca, 94);
					trocandoBoca = false;
					//Window.alert("boca carregada..");
				}
			});
			as.add(imgBoc);
			as.start();
		} else {
			listEstiloBocaPendente.add(estBoca);
		}
	}

	public void trocaBocaTemporaria(final PosicaoBoca posBC, int tempo) {
		trocandoTemporario = true;
		tempoTrocaTempDest = tempo;
		tempoTrocaTemp = 0;
		posBocaTemp = getPosicaoBocaAtual();
		trocaPosicaoBoca(posBC);
	}
}